package com.tanhua.backstage.service;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tanhua.common.mapper.BsMapper;
import com.tanhua.common.pojo.BsUser;
import io.jsonwebtoken.JwsHeader;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
@Slf4j
public class SystemUserService {
    @Autowired
    private BsMapper bsMapper;
    @Autowired
    private RedisTemplate<String,String> redisTemplate;
    @Value("${jwt.secret}")
    private String secret;
    /**
     * 登录校验
     * @param param
     * @return
     */
    public String login(Map<String, String> param) {
        //从map集合中获取前端传过来的参数
        String username = param.get("username");
        String password = param.get("password");
        String verificationCode = param.get("verificationCode");
        String uuid = param.get("uuid");

        //校验用户名和密码
        QueryWrapper<BsUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username",username)
                .eq("password",password);
        BsUser bsUser = bsMapper.selectOne(queryWrapper);
        if(ObjectUtil.isEmpty(bsUser)){
            //用户名和密码校验失败
            log.error("用户名和密码校验失败~");
            return "1";
        }
        //校验成功--继续校验验证码
        String redisKey=CheckService.VALIDATE+uuid;
        String code = redisTemplate.opsForValue().get(redisKey);
        //将验证码与redis中的验证码进行比较
        if(!StrUtil.equalsIgnoreCase(verificationCode,code)){
            //验证码不一致
            log.error("验证码校验失败~ code="+code);
            return "2";
        }

        //验证码校验成功，删除redis中的验证码
        redisTemplate.delete(redisKey);
        // 生成token
        //设置头部信息
        HashMap<String, Object> header = new HashMap<String, Object>();
        header.put(JwsHeader.TYPE, JwsHeader.JWT_TYPE);
        header.put(JwsHeader.ALGORITHM, "HS256");

        //设置登录信息:id
        Map<String, Object> claims = new HashMap<String, Object>();
        claims.put("id", bsUser.getId());
        claims.put("username",bsUser.getUsername());
        //claims.put("avatar",bsUser.getAvatar());

        // 生成token
        String token = Jwts.builder()
                .setHeader(header)  //header，可省略
                .setClaims(claims) //payload，存放数据的位置，不能放置敏感数据，如：密码等
                .signWith(SignatureAlgorithm.HS256, secret) //设置加密方法和加密盐
                .setExpiration(new Date(System.currentTimeMillis() + 1000*3600*2)) //设置过期时间，2小时后过期
                .compact();
        //将token保存到redis中 登出时删除redis中的键值对 校验token时获取不到redis中的键值对----直接校验失败----即可实现真正退出
        //一小时后redis中的token失效，实现自动退出功能
         redisTemplate.opsForValue().set(token,"1",1, TimeUnit.HOURS);
        return token;
    }
}
